#include "smartalloc_wrap.h"
#include "util.h"

#include <algorithm>
#include <cctype>
#include <iostream>
#include <sstream>
#include <iomanip>

using namespace std;

pair<string, string> fmtstrs(const vector<byte> &vec, uint32_t & addr) {
   ostringstream hx, ascii;

   hx  << hex << setfill('0');

   for(int i = 0; addr < vec.size() &&  i < 16; i++, addr++) {
      hx << setw(2) << (int)vec.at(addr); if(i && i % 2) hx << " ";
      ascii << (char)(isgraph(vec.at(addr)) ? vec.at(addr) : '.');
   }
   return pair<string, string>(hx.str(), ascii.str());
}

std::pair<std::string, std::string> fmtstrs(const std::vector<byte> &vec) {
   uint32_t jnk=0;
   return fmtstrs(vec, jnk);
}

ostream & operator <<(ostream &os, const vector<byte> &vec) {
   // 0000000: 2369 6e63 6c75 6465 2022 7574 696c 2e68  #include "util.h
   // 0000010: 220a 0a23 696e 636c 7564 6520 3c61 6c67  "..#include <alg
   
   os << hex;
   uint32_t addr = 0;
   while(addr < vec.size()) {
      os << setw(7) << right << setfill('0') << addr << ": ";

      pair<string, string> ss = fmtstrs(vec, addr);

      os << setw(40) << setfill(' ') << left << ss.first << " " << ss.second << endl;
   }
   
   os << dec;
   return os;
}

